// package: learn-go
// filename: lottery1
// author: diogoxiang@gmail.com
// time: 2023/11/15 10:55

package lottery1

import (
	"errors"
	"math/rand"
)

// 抽奖概率
type Probability struct {
	// 奖品名称
	Name string `json:"name,omitempty"`
	// 概率
	Probability float64 `json:"probability,omitempty"`
	// 剩余数量
	Remaining int `json:"remaining,omitempty"`
	// 奖池
	Pool int `json:"pool,omitempty"`
}

// 抽奖方法
func Lottery(probabilities []*Probability) (int, error) {
	// 检查概率
	if !(0 != len(probabilities)) {
		return -1, errors.New("概率列表为空")
	}
	// 声明 sum 变量
	var sum float64 = 0

	//fmt.Println(len(probabilities))
	//fmt.Println(probabilities)
	// 遍历概率列表，找到第一个概率大于或等于随机数的奖品
	for _, p := range probabilities {
		// 累加概率
		sum += p.Probability
		//fmt.Println(p)
	}
	// 如果概率总和不为 1，则返回错误
	if sum != 1.0 {
		return -1, errors.New("概率总和应为1")
	}
	// 生成随机数
	n := rand.Float64()

	// 遍历概率列表，找到第一个概率大于或等于随机数的奖品
	for i, p := range probabilities {
		if n <= p.Probability {
			// 如果奖品剩余数量为0，则跳过
			if p.Remaining == 0 {
				continue
			}
			// 扣除奖品剩余数量
			p.Remaining--
			// 返回奖品索引
			return i, nil
		}
	}

	// 如果没有找到，则返回-1
	return -1, nil
}
